<?php

/**
 * Http类处理Http请求
 */

namespace Lib;

class Http
{

    /**
     * 获取$_GET参数
     *
     * @param string $k       键值 如果是null返回所有get参数
     * @param miexd $default  默认值如果没有默认返回
     * @param bool $bXssClean 是否进行XSS过滤
     * @return string|array
     */
    public static function get($k = null, $default = null, $bXssClean = false)
    {
        if (null === $k) {
            return $_GET;
        }

        return isset($_GET[$k]) ? ($bXssClean ? self::xssClean($_GET[$k]) : $_GET[$k]) : $default;
    }

    /**
     * 获取$_POST参数
     *
     * @param string $k       键值 如果是null返回所有post参数
     * @param miexd $default  默认值如果没有默认返回
     * @param bool $bXssClean 是否进行XSS过滤
     * @return string
     */
    public static function post($k = null, $default = null, $bXssClean = false)
    {
        if (null === $k) {
            return $_POST;
        }

        return isset($_POST[$k]) ? ($bXssClean ? self::xssClean($_POST[$k]) : $_POST[$k]) : $default;
    }

    /**
     * 获取$_SERVER参数
     *
     * @param string $k      键值 如果是null返回所有server参数
     * @param miexd $default 默认值如果没有默认返回
     * @return string
     */
    public static function server($k = null, $default = null)
    {
        if (null === $k) {
            return $_SERVER;
        }

        return isset($_SERVER[$k]) ? $_SERVER[$k] : $default;
    }

    /**
     * 获取$_SESSION参数
     *
     * @param string $k      键值 如果是null返回所有session参数
     * @param miexd $default 默认值如果没有默认返回
     * @return string
     */
    public static function session($k = null, $default = null)
    {
        if (null === $k) {
            return $_SESSION;
        }

        return isset($_SESSION[$k]) ? $_SESSION[$k] : $default;
    }

    /**
     * 设置$_SESSION参数
     *
     * @param string $k 键值
     * @param string $v session的值
     * @return null
     */
    public static function setSession($k, $v)
    {
        $_SESSION[$k] = $v;
    }

    /**
     * 获取$_COOKIE参数
     *
     * @param string $k      键值 如果是null返回所有cookie参数
     * @param miexd $default 默认值如果没有默认返回
     * @return string
     */
    public static function cookie($k = null, $default = null)
    {
        if (null === $k) {
            return $_COOKIE;
        }

        return isset($_COOKIE[$k]) ? $_COOKIE[$k] : $default;
    }

    /**
     * 设置$_COOKIE
     *
     * @param string $k      键值
     * @param string $v      cookie值
     * @param int $time      cookie失效时间
     * @param string $path   cookie存储路径
     * @param string $domain cookie作用域
     * @return string
     */
    public static function setCookie($k, $v, $time = 0, $path = '/', $domain = '')
    {
        if ($domain == '') {
            $domain = self::server('HTTP_HOST');
        }

        return setcookie($k, $v, $time, $path, $domain);
    }

    /**
     * 页面跳转
     *
     * @param string $url 跳转地址
     * @return  null
     */
    public static function jump($url, $time = '')
    {
        if ($time) {
            if ($url == '-1') {
                header("refresh:" . $time . ";url= " . self::server('HTTP_REFERER'));
            } else {
                header("refresh:" . $time . ";url={$url}");
            }
        } else {
            if ($url == '-1') {
                header("Location: " . self::server('HTTP_REFERER'));
            } else {
                header("Location: {$url}");
            }
            //跳转之后退出防止跳转之后程序继续执行
            exit;
        }
    }

    /**
     * Ajax方式返回数据到客户端
     *
     * @param mixed $data     要返回的数据
     * @param String $info    提示信息
     * @param boolean $status 返回状态
     * @param String $status  ajax返回类型 JSON XML
     * @return  void
     */
    public static function ajaxReturn($data, $info = '', $status = 1, $type = 'json')
    {

        $result           = array();
        $result['status'] = $status;
        $result['info']   = $info;
        $result['data']   = $data;

        //判断ajax返回类型
        if ($type == 'json') {
            //返回JSON数据格式到客户端,包含状态信息
            header("Content-Type:text/html; charset=utf-8");
            exit(json_encode($result));
        } elseif ($type == 'xml') {
            //返回xml格式数据
            header("Content-Type:text/xml; charset=utf-8");
            exit(xml_encode($result));
        } elseif ($type == 'eval') {
            //返回可执行的js脚本
            header("Content-Type:text/html; charset=utf-8");
            exit($data);
        } elseif ($type == 'jsonp') {
            header("Content-Type:text/html; charset=utf-8");
            exit('try{' . Http::get("callback") . '(' . json_encode($result) . ')}catch(e){};');
        }
    }

    /**
     * 关闭浏览器缓存
     *
     * @return null
     */
    public static function noCache()
    {
        header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
        header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
        header("Cache-Control: no-store, no-cache, must-revalidate");
        header("Cache-Control: post-check=0, pre-check=0", false);
        header("Pragma: no-cache");
    }

    /**
     * 获取页面的来源地址
     *
     * @return null
     */
    public static function getFromUrl()
    {
        return self::server('HTTP_REFERER', '');
    }

    /**
     * 获取页面的来源地址
     *
     * @return null
     */
    public static function getCurrentUrl()
    {
        return self::server('REQUEST_URI', '');
    }

    /**
     * 判断post是否存在某个值 不管该值的真假 只要isset 返回true
     *
     * @param string $key
     * @return boolean
     */
    public static function isSetPost($key)
    {
        $arr = self::post();

        return isset($arr[$key]);
    }

    /**
     * 获取$_REQUEST参数
     *
     * @param string $k      键值 如果是null返回所有server参数
     * @param miexd $default 默认值如果没有默认返回
     * @return string
     */
    public static function request($k = null, $default = null)
    {
        if (null === $k) {
            return $_REQUEST;
        }

        return isset($_REQUEST[$k]) ? $_REQUEST[$k] : $default;
    }

    /**
     * 设置post的值
     *
     * @param string $key
     * @param string $value
     * @return boolean
     */
    public static function setPost($key, $value)
    {
        $_POST[$key] = $value;
    }

    /**
     * 设置get的值
     *
     * @param string $key
     * @param string $value
     * @return boolean
     */
    public static function setGet($key, $value)
    {
        $_GET[$key] = $value;
    }

    /**
     * 设置request的值
     *
     * @param string $key
     * @param string $value
     * @return boolean
     */
    public static function setRequest($key, $value)
    {
        $_REQUEST[$key] = $value;
    }

    /**
     * Ajax方式返回错误信息
     *
     * @param String $error_msg 提示信息
     * @param String $type      ajax返回类型 JSON XML
     * @return  null
     */
    public static function ajaxError($error_msg = '', $type = 'json')
    {
        return self::ajaxReturn('', $error_msg, 0);
    }

    /**
     * Ajax方式返回正确信息
     *
     * @param String|array $data 返回数据
     * @param String $msg        提示信息
     * @param String $type       ajax返回类型 JSON XML
     * @return  null
     */
    public static function ajaxSucceed($data = '', $msg = '', $type = 'json')
    {
        return self::ajaxReturn($data, $msg, 1);
    }

    /**
     * 功能：  向服务器发送POST请求
     *
     * @param string $url    要请求的url地址。必选
     * @param array $post    请求参数。可选
     * @param array $options curl配置参数。可选
     * @return mixed
     */
    public static function sendPost($url, array $post = array(), array $options = array())
    {
        $defaults = array(
            CURLOPT_POST           => 1,
            CURLOPT_HEADER         => 0,
            CURLOPT_URL            => $url,
            CURLOPT_RETURNTRANSFER => 1,
            CURLOPT_TIMEOUT        => 5,
            CURLOPT_CONNECTTIMEOUT => 5,
            CURLOPT_POSTFIELDS     => http_build_query($post, '', '&'),
            CURLOPT_REFERER        => __WWW__,
        );
        $ch       = curl_init();
        curl_setopt_array($ch, ($options + $defaults));
        $result = curl_exec($ch);
        //调试信息
        if (defined('DEBUG') && true === DEBUG) {
            $info  = curl_getinfo($ch);
            $arr   = array();
            $arr[] = array('opt', 'info');
            $arr[] = array('query', $post ? var_export($post, true) : '');
            $arr[] = array('response', $result);
            foreach ($info as $k => $v) {
                $arr[] = array($k, $v);
            }
            fb($arr, 'POST请求：' . $url, FirePHP::TABLE);
        }
        if (curl_error($ch)) {
            $result = false;
        }
        curl_close($ch);

        return $result;
    }

    /**
     * 功能： 向服务器发送GET请求
     *
     * @param string $url    要请求的url地址。必选
     * @param array $get     请求参数。可选
     * @param array $options curl配置参数。可选
     * @return mixed
     */
    function sendGet($url, array $get = array(), array $options = array())
    {
        $defaults = array(
            CURLOPT_URL            => $url . (strpos($url, '?') === false ? '?' : '') . http_build_query($get, '', '&'),
            CURLOPT_TIMEOUT        => 5, //设置curl允许执行的最长秒数
            CURLOPT_CONNECTTIMEOUT => 5, //设置连接等待时间,0不等待
            CURLOPT_HEADER         => 0,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_REFERER        => __WWW__,
        );
        $ch       = curl_init();
        curl_setopt_array($ch, ($options + $defaults));
        $result = curl_exec($ch);
        //调试信息
        if (defined('DEBUG') && true === DEBUG) {
            $info  = curl_getinfo($ch);
            $arr   = array();
            $arr[] = array('opt', 'info');
            $arr[] = array('query', $get ? var_export($get, true) : '');
            $arr[] = array('response', $result);
            foreach ($info as $k => $v) {
                $arr[] = array($k, $v);
            }
            fb($arr, 'GET请求：' . $url, FirePHP::TABLE);
        }
        if (curl_error($ch)) {
            $result = false;
        }
        curl_close($ch);

        return $result;
    }

    /**
     * 关闭当前窗口
     *
     * @param string $msg 关闭之前提示信息
     * @return null;
     */
    public static function closeWindow($msg = null)
    {
        echo '<script language="javascript">';
        if (null !== $msg) {
            echo "alert('{$msg}');";
        }
        echo 'window.close();';
        echo '</script>';
        exit;
    }

    /**
     * php防注入和XSS攻击通用过滤
     *
     * @param string $data   待转换字符串
     * @param bool $bAllTran 是否转义所有的&<>
     * @return string
     * @see    http://www.jb51.net/article/72175.htm
     */
    public static function xssClean($data, $bAllTran = false)
    {
        // Fix &entity＼n;
        $data = str_replace(array('&', '<', '>'), array('&amp;', '&lt;', '&gt;'), $data);
        $data = preg_replace('/(&#*\w+)[\x00-\x20]+;/u', '$1;', $data);
        $data = preg_replace('/(&#x*[0-9A-F]+);*/iu', '$1;', $data);
        $data = html_entity_decode($data, ENT_COMPAT, 'UTF-8');

        do {// Remove really unwanted tags
            $old_data = $data;
            $data     = preg_replace('#<(/*(?:applet|b(?:ase|gsound|link)|embed|frame(?:set)?|i(?:frame|layer)|l(?:ayer|ink)|meta|object|s(?:cript|tyle)|title|xml)[^>]*+)>#i', "&lt;\\1&gt;", $data);
        } while ($old_data !== $data);
        // we are done...
        $bAllTran && $data = str_replace(array('&', '<', '>'), array('&amp;', '&lt;', '&gt;'), $data);

        return $data;
    }

    /**
     * 显示报错信息
     *
     * @param string $message
     * @param string $gotoUrl
     */
    public static function showError($message, $gotoUrl = null)
    {

        //如果是返回则让知道了按钮失效
        if (null !== $gotoUrl && $gotoUrl == '-1') {
            $url = 'javascript:;';
        } else {
            $url = $gotoUrl;
        }
        $html = '
        <!DOCTYPE html>
            <head>
                <meta charset="utf-8">
                <!--[if IE]>
                <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"><![endif]-->
                <title>错误提醒</title>
                <meta name="keywords" content=""/>
                <meta name="description" content=""/>
                <meta name="viewport" content="width=device-width">
                <link rel="stylesheet" href="' . Static_PATH . '/css/templatemo_main.css" type="text/css">
            </head>
            <body>
            
            <div class="container" style="margin-top: 40px;">
                <div id="myAlert" class="alert alert-danger">
                <a href="' . $gotoUrl . '" class="close">&times;</a>
                    <strong>' . $message . '</strong>
                    <a href="' . $gotoUrl . '" class="alert-link" style="margin-left: 10px;">点击返回</a>
                </div>
            </div>
            
            </body>
            </html>
        ';

        echo $html;
        if (null !== $goto && $goto == '-1') {
            echo "<Script Language=\"Javascript\">setTimeout(function(){history.back(-1)},2000)</Script>";
        } else {
            echo "<Script Language=\"Javascript\">setTimeout(function(){location.href='" . $url . "'},1000)</Script>";
        }
        exit;
    }

}
